package br.cos.ufrj.bd3.control;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;

import br.cos.ufrj.bd3.model.Elemento;
import br.cos.ufrj.bd3.model.Extrato;
import br.cos.ufrj.bd3.model.Frase;
import br.cos.ufrj.bd3.model.Noticia;
import br.cos.ufrj.bd3.model.Paragrafo;
import br.cos.ufrj.bd3.model.Secao;
import br.cos.ufrj.bd3.model.SubTitulo;
import br.cos.ufrj.bd3.model.Titulo;


public class ParserCETENFolha {

	public List<Extrato> parsearAnotado(int indiceArquivo)	throws Exception {

		FileInputStream fis = new FileInputStream("docsAnotado/p"+indiceArquivo);
		Scanner scanner = new Scanner(fis);

		StringBuilder sbTitulo = null;
		StringBuilder sbConteudo = null;
		StringBuilder sbSubTitulo = null;
		StringBuilder sbLista = null;

		List<Extrato> listaExtratos = new ArrayList<Extrato>();

		boolean dentroExtrato = false;
		boolean dentroFrase = false;
		boolean dentroTitulo = false;
		boolean dentroParagrafo = false;
		boolean dentroSubtitulo = false;
		boolean dentroLista = false;

		Extrato extrato = null;
		Noticia noticia = null;
		Frase frase = null;
		Paragrafo paragrafo = null;
		Titulo titulo = null;
		SubTitulo subTitulo = null;
		Elemento elemento = null;
		String caderno = null;
		String stringSecao = null;
		
		while (scanner.hasNextLine()) {
			String linha = scanner.nextLine();
			//		System.out.println(linha);
			if (linha.contains("<ext ")) {

				dentroExtrato = true;
				extrato = new Extrato();
				String inicio = linha.substring("<ext id=".length());
				noticia = new Noticia();
				noticia.setTitulo(null);
				
				String conteudoId = inicio.substring(0, inicio.indexOf(" cad="));
				int posInicioCad = linha.indexOf("cad=");
				int posInicioSec = linha.indexOf("sec=");
				
				caderno = linha.substring(posInicioCad + 5, posInicioSec - 2);
				noticia.setCaderno(caderno);
				
				stringSecao = linha.substring(posInicioSec + 5, linha.indexOf("sem=") - 2);
				StringTokenizer tokenizer = new StringTokenizer(stringSecao, "-");
				while (tokenizer.hasMoreElements()) {
					String conteudoSecao = tokenizer.nextToken();
					
					Secao secao = PopulaBD.procuraSecao(conteudoSecao);
					noticia.getListaSecoes().add(secao);
					secao.getListaNoticias().add(noticia);
				}
				
				extrato.setIdExtrato(conteudoId);

			} else if (linha.contains("</ext>")) {
				if (titulo == null) {
					noticia.setId(++Noticia.n);
					extrato.getListaNoticias().add(noticia);
				}
				dentroExtrato = false;
				listaExtratos.add(extrato);
				titulo = null;

			} else if (linha.contains("<p>")) {

				dentroParagrafo = true;
				paragrafo = new Paragrafo();

			} else if (linha.contains("</p>")) {

				dentroParagrafo = false;
				noticia.getListaParagrafos().add(paragrafo);

			}  else if (linha.contains("<s>") || linha.contains("<s head>")) {

				dentroFrase = true;
				frase = new Frase();
				if (dentroParagrafo) {
					sbConteudo = new StringBuilder();
				}

			} else if (linha.contains("</s>")) {

				dentroFrase = false;

				if (dentroParagrafo) {
					frase.setConteudo(sbConteudo.toString());
					paragrafo.getListaFrases().add(frase);
				}

			} else if (linha.contains("<t>")) {

				dentroTitulo = true;
				sbTitulo = new StringBuilder();
				titulo = new Titulo();
				
				

			} else if (linha.contains("</t>")) {

				dentroTitulo = false;
				titulo.setConteudo(sbTitulo.toString());
				
				noticia = new Noticia();
				noticia.setTitulo(titulo);
				noticia.setCaderno(caderno);
				noticia.setId(++Noticia.n);
				extrato.getListaNoticias().add(noticia);
				
				StringTokenizer tokenizer = new StringTokenizer(stringSecao, "-");
				while (tokenizer.hasMoreElements()) {
					String conteudoSecao = tokenizer.nextToken();
					
					Secao secao = PopulaBD.procuraSecao(conteudoSecao);
					noticia.getListaSecoes().add(secao);
				}

			} else if (linha.contains("<a>")) {

				/*String autor = linha.subSequence(2, linha.length() - 4).toString();
		System.out.println(autor);*/

			} else if (linha.contains("<situacao>")) {

				/*String extra = linha.subSequence(2, linha.length() - 4).toString();
		System.out.println(extra);*/

			} else if (linha.contains("<li>")) {

				dentroLista = true;
				sbLista = new StringBuilder();
				elemento = new Elemento();

			} else if (linha.contains("</li>")) {

				dentroLista = false;
				elemento.setConteudo(sbLista.toString());
				noticia.getListaElementos().add(elemento);

			} else if (linha.contains("<caixa>")) {

				dentroSubtitulo = true;
				subTitulo = new SubTitulo();
				sbSubTitulo = new StringBuilder();

			} else if (linha.contains("</caixa>")) {

				dentroSubtitulo = false;
				subTitulo.setConteudo(sbSubTitulo.toString());
				noticia.setSubTitulo(subTitulo);

			} else {
				if (dentroTitulo) {
					sbTitulo.append(linha + "\n");
				} else if (dentroParagrafo) {
					sbConteudo.append(linha + "\n");
				} else if (dentroSubtitulo) {
					sbSubTitulo.append(linha + "\n");
				} else if (dentroLista) {
					sbLista.append(linha + "\n");
				}
			}
		}

		fis.close();
		scanner.close();
		return listaExtratos;
	}
	
	public List<Extrato> parsear(int indiceArquivo) throws Exception {
		
		FileInputStream fis = new FileInputStream("docs/p"+indiceArquivo);
		Scanner scanner = new Scanner(fis);
		
		StringBuilder sbTitulo = null;
		StringBuilder sbConteudo = null;
		StringBuilder sbSubTitulo = null;
		StringBuilder sbLista = null;
		
		List<Extrato> listaExtratos = new ArrayList<Extrato>();
		
		boolean dentroExtrato = false;
		boolean dentroFrase = false;
		boolean dentroTitulo = false;
		boolean dentroParagrafo = false;
		boolean dentroSubtitulo = false;
		boolean dentroLista = false;
		
		Extrato extrato = null;
		Noticia noticia = null;
		Frase frase = null;
		Paragrafo paragrafo = null;
		Titulo titulo = null;
		SubTitulo subTitulo = null;
		Elemento elemento = null;
		String caderno = null;
		String stringSecao = null;
		
		while (scanner.hasNextLine()) {
			String linha = scanner.nextLine();
			if (linha.contains("<ext ")) {
				
				dentroExtrato = true;
				extrato = new Extrato();
				noticia = new Noticia();
				noticia.setTitulo(null);
				
				String inicio = linha.substring("<ext id=".length());
				String conteudoId = inicio.substring(0, inicio.indexOf("cad")).trim();
				
				int posInicioCad = linha.indexOf("cad=");
				int posInicioSec = linha.indexOf("sec=");
				
				caderno = linha.substring(posInicioCad + 5, posInicioSec - 2);
				noticia.setCaderno(caderno);
				
				stringSecao = linha.substring(posInicioSec + 5, linha.indexOf("sem=") - 2);
				StringTokenizer tokenizer = new StringTokenizer(stringSecao, "-");
				while (tokenizer.hasMoreElements()) {
					String conteudoSecao = tokenizer.nextToken();
					Secao secao = PopulaBD.procuraSecao(conteudoSecao);
					noticia.getListaSecoes().add(secao);
					secao.getListaNoticias().add(noticia);
				}

				extrato.setIdExtrato(conteudoId);
				
			} else if (linha.contains("</ext>")) {
				if (titulo == null) {
					noticia.setId(++Noticia.n);
					extrato.getListaNoticias().add(noticia);
				}
				dentroExtrato = false;
				listaExtratos.add(extrato);
				titulo = null;
			} else if (linha.contains("<t>")) {
				
				int inicio = linha.indexOf("<t>");
				int fim = linha.indexOf("</t>");
				
				titulo = new Titulo();
				noticia = new Noticia();
				noticia.setCaderno(caderno);
				titulo.setConteudo(linha.substring(inicio + 4, fim).trim());
				noticia.setTitulo(titulo);
				noticia.setId(++Noticia.n);
				extrato.getListaNoticias().add(noticia);
				
				
			} else if (linha.contains("<p>")) {
				paragrafo = new Paragrafo();
				dentroParagrafo = true;
			} else if (linha.contains("</p>")) {
				
				noticia.getListaParagrafos().add(paragrafo);
				dentroParagrafo = false;
			} else if (linha.contains("<s>") && dentroParagrafo) {
				frase = new Frase();
				
				int inicio = linha.indexOf("<s>");
				int fim = linha.indexOf("</s>");
				
				frase.setConteudo(linha.substring(inicio + 4, fim).trim());
				paragrafo.getListaFrases().add(frase);
			}
		}
		
		fis.close();
		scanner.close();
		return listaExtratos;
		
	}

	public void executarStemmerPalavras(List<Extrato> listaExtratos) throws Exception {
		for (Extrato e: listaExtratos) {
			List<Noticia> listaNoticias = e.getListaNoticias();

			for (Noticia n: listaNoticias) {
				List<Paragrafo> listaParagrafo = n.getListaParagrafos();

				for (Paragrafo p: listaParagrafo) {
					List<Frase> listaFrases = p.getListaFrases();

					for (Frase f: listaFrases) {
						StringBuilder builder = new StringBuilder();
						StringTokenizer tokenizer = new StringTokenizer(f.getConteudo(), "\n");
						while (tokenizer.hasMoreElements()) {
							String token = tokenizer.nextToken();

							int inicioString = token.indexOf("[");
							int terminoString = token.indexOf("]");

							if (inicioString != -1 && terminoString != -1) {
								String termo = token.substring(inicioString + 1, terminoString);
								builder.append(termo.replaceAll("=", " ") + " ");
							} 
						}
						f.setConteudo(builder.toString());
					}
				}

				SubTitulo subTitulo = n.getSubTitulo();
				if (subTitulo != null) {
					StringBuilder sbSubT = new StringBuilder();
					StringTokenizer tokenizerSubTitulo = new StringTokenizer(subTitulo.getConteudo(), "\n");
					while (tokenizerSubTitulo.hasMoreElements()) {
						String token = tokenizerSubTitulo.nextToken();

						int inicioString = token.indexOf("[");
						int terminoString = token.indexOf("]");

						if (inicioString != -1 && terminoString != -1) {
							String termo = token.substring(inicioString + 1, terminoString);
							sbSubT.append(termo.replaceAll("=", " ") + " ");
						} 
					}
					subTitulo.setConteudo(sbSubT.toString());
				}
				
				Titulo titulo = n.getTitulo();
				if (titulo != null) {
					StringBuilder sbTit = new StringBuilder();
					StringTokenizer tokenizerTitulo = new StringTokenizer(titulo.getConteudo(), "\n");
					while (tokenizerTitulo.hasMoreElements()) {
						String token = tokenizerTitulo.nextToken();

						int inicioString = token.indexOf("[");
						int terminoString = token.indexOf("]");

						if (inicioString != -1 && terminoString != -1) {
							String termo = token.substring(inicioString + 1, terminoString);
							sbTit.append(termo.replaceAll("=", " ") + " ");
						} 
					}
					titulo.setConteudo(sbTit.toString());
				}
			}
		}
	}
	
	public void executarStemmerPalavrasSemStopWords(List<Extrato> listaExtratos) throws Exception {
		for (Extrato e: listaExtratos) {
			List<Noticia> listaNoticias = e.getListaNoticias();

			for (Noticia n: listaNoticias) {
				List<Paragrafo> listaParagrafo = n.getListaParagrafos();

				for (Paragrafo p: listaParagrafo) {
					List<Frase> listaFrases = p.getListaFrases();

					for (Frase f: listaFrases) {
						f.setConteudo(removeStopWords(f.getConteudo()));
						/*StringBuilder builder = new StringBuilder();
						StringTokenizer tokenizer = new StringTokenizer(f.getConteudo(), "\n");
						while (tokenizer.hasMoreElements()) {
							String token = tokenizer.nextToken();

							int inicioString = token.indexOf("[");
							int terminoString = token.indexOf("]");

							if (inicioString != -1 && terminoString != -1) {
								String termo = token.substring(inicioString + 1, terminoString);
								builder.append(termo.replaceAll("=", " ") + " ");
							} 
						}
						String palavra = builder.toString();
						f.setConteudo(builder.toString());*/
					}
				}

				SubTitulo subTitulo = n.getSubTitulo();
				if (subTitulo != null) {
					subTitulo.setConteudo(removeStopWords(subTitulo.getConteudo()));
					/*StringBuilder sbSubT = new StringBuilder();
					StringTokenizer tokenizerSubTitulo = new StringTokenizer(subTitulo.getConteudo(), "\n");
					while (tokenizerSubTitulo.hasMoreElements()) {
						String token = tokenizerSubTitulo.nextToken();

						int inicioString = token.indexOf("[");
						int terminoString = token.indexOf("]");

						if (inicioString != -1 && terminoString != -1) {
							String termo = token.substring(inicioString + 1, terminoString);
							sbSubT.append(termo.replaceAll("=", " ") + " ");
						} 
					}
					subTitulo.setConteudo(sbSubT.toString());*/
				}
				
				Titulo titulo = n.getTitulo();
				if (titulo != null) {
					titulo.setConteudo(removeStopWords(titulo.getConteudo()));
					/*StringBuilder sbTit = new StringBuilder();
					StringTokenizer tokenizerTitulo = new StringTokenizer(titulo.getConteudo(), "\n");
					while (tokenizerTitulo.hasMoreElements()) {
						String token = tokenizerTitulo.nextToken();

						int inicioString = token.indexOf("[");
						int terminoString = token.indexOf("]");

						if (inicioString != -1 && terminoString != -1) {
							String termo = token.substring(inicioString + 1, terminoString);
							sbTit.append(termo.replaceAll("=", " ") + " ");
						} 
					}
					titulo.setConteudo(sbTit.toString());*/
				}
			}
		}
	}
	
	public static String[] listaStopWords(String nomeArquivo) {
		File fileStopWords = new File(nomeArquivo);
		List<String> sw = new ArrayList<String>();
		try {
			Scanner scan = new Scanner(fileStopWords);

			while (scan.hasNext())  {
				sw.add(scan.nextLine());
			}
			scan.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} 
		return sw.toArray(new String[0]);
	}
	
	public static String removeStopWords(String frase) {
		String[] stopWords = listaStopWords("stopwords.txt");
		
		StringTokenizer tokenizer = new StringTokenizer(frase, "\n");
		StringBuilder sb = new StringBuilder();
		while (tokenizer.hasMoreElements()) {
			String linha = (String) tokenizer.nextElement();
			boolean remove = false;
			
			for (int i = 0; i < stopWords.length; i++) {
				
				int inicioString = linha.indexOf("[");
				int terminoString = linha.indexOf("]");

				if (inicioString != -1 && terminoString != -1) {
					String termo = linha.substring(inicioString + 1, terminoString);
					if (termo.equalsIgnoreCase(stopWords[i])) {
						remove = true;
						break;
					}					
				}
				
			}
			
			if (!remove) {
				sb.append(linha + "\n");
			}
		}
		
		return sb.toString();
	}
}
